home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / patches / hsmoda07 / hsm_doku / midi_x.txt < prev    next >
Text File  |  1996-01-21  |  13KB  |  284 lines

  1. MIDI.PRG
  2. ********
  3.  
  4. (The English part is appended at the German, look for it.)
  5.  
  6. Dies ist ein Treiber zur Nutzung der MIDI-Schnittstelle ber die in 
  7. SERSOFST.TXT definierten Filefunktionen.
  8.  
  9.  
  10. Allgemeines
  11. -----------
  12. ########## momentan ist das noch eine Experimentalversion ###########
  13. Dieser Treiber geh”rt zum HSMODA-Paket. Er ist nicht fr Musiksoftware 
  14. gedacht, die die MIDI-Schnittstelle zu ihrem ursprnglichen Zweck benutzt, 
  15. sondern zur "ganz normalen" Datenbertragung. Wer die MIDI-Schnittstelle 
  16. nicht zur "ganz normalen" Datenbertragung nutzt, braucht diesen Treiber 
  17. nicht.
  18.  
  19.  
  20. Kommunikationsparameter
  21. -----------------------
  22. Es wird alles untersttzt, was das ACIA und die RxD/TxD-Schnittstelle 
  23. k”nnen.
  24. Baudraten: 31250, 7812
  25. Handshake: "keiner", "XON/XOFF"
  26. Zeichenformate: 7e2, 7o2, 7e1, 7o1, 8n2, 8n1, 8e1, 8o1
  27.  
  28.  
  29. Konfiguration
  30. -------------
  31. Die Konfiguration erfolgt mit dem SETTER.TTP. Zur Bedienung siehe 
  32. SETTER.TXT.
  33.  
  34. RBL
  35. Einstellung der Empfangspuffergr”že. Minimum 16, Normal 256, Maximum 
  36. 65534.
  37.  
  38. TBL
  39. Einstellung der Sendepuffergr”že. Minimum 16, Normal 256, Maximum 65534.
  40.  
  41. OMIX
  42. Der Treiber kann sich in den XBIOS-Aufruf einh„ngen, um die Funktionen 
  43. Iorec und Midiws der fr die originale MIDI-Schnittstelle abzufangen und 
  44. zu bearbeiten. Wird mit "Nein" geantwortet, h„ngt dieser Treiber nicht im 
  45. XBIOS, bei "Ja" h„ngt er im XBIOS. "Ja" sollte nur erforderlich sein, wenn 
  46. man Software benutzt, die die MIDI-Originalroutinen nutzen will und nicht 
  47. die neue GEMDOS-Schnittstelle oder die neue BIOS-Nummer.
  48.  
  49. MISY
  50. Der Treiber kann sich zur Interruptbearbeitung an einer von zwei Stellen 
  51. einh„ngen. Die fr MIDI schnellste Variante ist der MFP-I4-Interrupt, 
  52. dessen Vektor auf Adresse $118 steht. Dazu muž MISY="Nein" sein. Als 
  53. Alternative belegt der Treiber den midisys-Vektor der KBDVECS-Struktur 
  54. wenn MISY="Ja" eingestellt ist.
  55.  
  56.  
  57. Kompatibilit„t
  58. --------------
  59. Wenn ein TOS ab 1.02 aufw„rts vorliegt, wird auch die 
  60. Original-BIOS-Schnittstelle fr MIDI (BIOS-Nummer 3, aber Nummer 4 fr 
  61. Bcostat) vom Treiber mit bernommen, indem er sich in die xco*-Vektoren 
  62. eintr„gt. Dies verursacht keinen weiteren Aufwand.
  63.  
  64. Mit dem Konfigurationspunkt "OMIX" kann man auch die Funktionen Midiws und 
  65. Iorec fr Original-MIDI zuschalten. Dazu muž sich der Treiber jedoch extra 
  66. in den XBIOS-Trap einh„ngen.
  67.  
  68. Im Gegensatz zu den Originalroutinen erfolgt das Senden ber Bconout oder 
  69. Midiws immer interruptgesteuert. Im Original kehrte Midiws erst 
  70. zurck, wenn alle Zeichen gesendet wurden, jetzt kehrt es bereits zurck, 
  71. wenn sich alle Zeichen im Sendepuffer befinden. Dies k”nnte m”glicherweise 
  72. Musiksoftware irritieren.
  73.  
  74. "MISY"="Ja" ist kompatibler als "Nein", aber etwas langsamer.
  75.  
  76.  
  77. Bildschirmschoner
  78. -----------------
  79. Teilweise gibt es Probleme mit Bildschirmschonern, die ebenfalls in 
  80. einigen ACIA-Interrupts und Žhnlichem herumh„ngen. Teilweise lassen sich 
  81. diese Probleme l”sen, wenn der Bildschirmschoner nach dem MIDI.PRG 
  82. gestartet wird. Ist dadurch das Problem gel”st, so bedeutet dies aber 
  83. meist auch, daž die MIDI-Interruptbearbeitung etwas langsamer wird.
  84.  
  85.  
  86. (Interna:) Implementierungsvarianten
  87. ------------------------------------
  88. Das Senden erfolgt auch interruptgesteuert. Falls man im Sendeinterrupt 
  89. nochmal extra Statusregister Bit1 abfragt (braucht man auch nicht, denn 
  90. wenn im Polling gesendet wird, dann ist der Sendepuffer per Definition 
  91. leer (sonst gibt es sowieso Chaos), und es kann deshalb ohnehin nichts in 
  92. den ACIA geschrieben werden), braucht man Midiws und Bconout-MIDI nicht 
  93. abzufangen, da diese direkt im Polling senden und die Strukturen dieses 
  94. Treibers nicht st”ren. Sie k”nnten sich zwar in eine Interruptsendung 
  95. einmischen, das sollte aber nicht passieren, da entweder alte Programme 
  96. diese nicht-Interrupt-Aufrufe benutzen (wo das Polling-Midiws 
  97. m”glicherweise zwecks Kompatibilit„t n”tig ist) oder neue Programme ber 
  98. GEMDOS oder die h”here BIOS-Nummer arbeiten. Da n„mlich MIDI im BIOS nicht 
  99. immer #3 ist, muž man ohnehin im RSVF die Nummer eines extra eingeh„ngten 
  100. Treibers eintragen und nur zu Kompatibilit„tszwecken das alte #3 
  101. untersttzen.
  102.  
  103. Es ist zu entscheiden, wie weit man die Optimierung (tausche Speicherplatz 
  104. und šbersichtlichkeit gegen Geschwindigkeit) treibt. 31250Bd bedeutet beim 
  105. Empfang eine Interruptfrequenz von 3125Hz bei 8N1 und eine zu 
  106. unterschreitende Interruptantwortzeit von 320us. Der 68000/8MHz braucht 
  107. 0.5us fr einen WORD-Speicherzugriff. Beim im TOS vorhandenen Sichern von 
  108. 8 Registern (als LONG) vergehen also schon 8us, zus„tzlich zu der reinen 
  109. Reaktionszeit der CPU. Nach der Bearbeitung werden nochmal 8us im 
  110. Interrupt zur Wiederherstellung verbraucht. Der IKBD-ACIA ist mit 7812.5Bd 
  111. vergleichsweise langsam.
  112.  
  113. "MISY"="Nein": MIDI.PRG ist direkt im MFP-I4-Interrupt (Vektor auf $118), 
  114. schnellstm”glich, alle MIDI-Vektoren in KBDVECS sind tot. Drfte evtl mit 
  115. einiger Musiksoft inkompatibel sein, egal, dafr ist der Treiber nicht. 
  116. Schmeižt bei Installation alles aus dem MFP-I4-Int raus, z.B. den 
  117. Templmon. Also Templmon erst nach MIDI.PRG starten oder "MISY"="Nein" 
  118. benutzen.
  119.  
  120. "MISY"="Ja": MIDI.PRG ist nur im KBDVECS.midisys-Vektor. Langsamer, aber 
  121. kompatibler. Nur KBDVECS.midivec und KBDVECS.vmiderr sind tot.
  122.  
  123.  
  124.  
  125. Andere Variante, evtl auch noch alternativ realisieren:
  126.  
  127. Als midisys(), langsamst, midivec() und vmiderr() werden benutzt, 
  128. restliche Interruptbedingungen bearbeitet midisys() selbst.
  129.  
  130.  
  131.  
  132.  
  133. (Fr Programmierer:) Die MIDI-Schnittstelle auf der Softwareseite
  134. =================================================================
  135.  
  136. Im TOS werden MIDI-Daten immer direkt gesendet. Es gibt keinen 
  137. Sende-IOREC. Nur Empfangsdaten werden im Interrupt behandelt, ein 
  138. Empfangs-IOREC existiert (XBIOS 14 Iorec (Ger„t 2)). XBIOS 15 Rsconf 
  139. existiert nicht. Zus„tzlich gibt es XBIOS 12 Midiws zum Versenden von 
  140. Bytefolgen. Diese Funktion arbeitet im Polling. Im BIOS ist MIDI 
  141. normalerweise Ger„t 3, aužer bei BIOS 8 Bcostat, dort ist es 4.
  142.  
  143. XBIOS 34 Kbdvbase liefert einen Datenblock, der Zeiger auf einige Routinen 
  144. enth„lt, die mit MIDI und dem IKBD zusammenh„ngen. Leider werden diese 
  145. Routinen oft falsch beschrieben, auch im Profibuch sind Fehler drin.
  146.  
  147. MIDI-ACIA und IKBD-ACIA liefern ihre Interruptmeldung aktiv-oder-verknpft 
  148. (ihre L-aktiven Open Collector Ausg„nge sind miteinander verbunden) ber 
  149. den gleichen Eingang (I4) des MFP (ST-MFP), der auf den 
  150. MFP-Interruptvektor auf Adresse $0118 fhrt.
  151.  
  152. Hier lauert bereits die erste Falle: Der MFP erzeugt einen Interrupt nur 
  153. bei einer H/L-Flanke am I4-Eingang. Diese Flanke tritt nur beim Wechsel 
  154. von "beide ACIA wollen keinen Interrupt" zu "mindestens ein ACIA fordert 
  155. Interrupt" auf. Setzt man jetzt die Interruptforderung nur im MFP zurck 
  156. und bearbeitet nicht beide ACIA so lange, bis I4 wieder H wird, so bleibt 
  157. I4 auf L und der MFP wird keine ACIA-Interrupts mehr melden. Dieser Fall 
  158. kann z.B. eintreten, wenn in einer sehr frhen Phase der 
  159. Systeminitialisierung Daten ber den MIDI-Port reinkommen.
  160.  
  161.  
  162. Kbdvbase (XBIOS 34)
  163. -------------------
  164. Diese Funktion liefert einen Zeiger auf einen Datenblock mit Zeigern auf 
  165. verschiedene Routinen im Zusammenhang mit MIDI und IKBD.
  166.  
  167. typedef struct {
  168.  void (*midivec)();  /* Midi-Eingabe */
  169.  void (*vkbderr)();  /* Tastaturfehler (default: nur RTS) */
  170.  void (*vmiderr)();  /* MIDIfehler (default: nur RTS) */
  171.  void (*statvec)();  /* Status des IKBD gelesen (default: nur RTS) */
  172.  void (*mousevec)(); /* Mausabfrage */
  173.  void (*clockvec)(); /* Uhrzeitabfrage */
  174.  void (*joyvec)();   /* Joystickabfrage (default: nur RTS) */
  175.  void (*midisys)();  /* MIDI-Systemvektor */
  176.  void (*ikbdsys)();  /* IKBD-Systemvektor */
  177.  WORD drvstat;       /* IKBD-Treiberstatus (benutzt als zwei Bytes) */
  178. } KBDVECS;
  179.  
  180. Erzeugt I4 des MFP einen Interrupt, so werden in der Serviceroutine 
  181. nacheinander midisys() und ikbdsys() aufgerufen. Falls I4 jetzt immer noch 
  182. L (also aktiv) ist, wird der Aufruf dieser beiden Routinen solange 
  183. wiederholt, bis I4 nach der Bearbeitung von ikbdsys() endlich H ist. Dann 
  184. wird der Interrupt im MFP als bearbeitet markiert und die Serviceroutine 
  185. beendet. Die XXXXsys() mssen selbst anhand des Statusregisters ihrer ACIA 
  186. feststellen, ob sie arbeiten oder gleich zurckkehren. Vor dem Aufruf der 
  187. Routinen wurden die Register A0-A3/D0-D3 gesichert, so daž man sie 
  188. benutzen kann. Sicherheitshalber sollte man aber nur A0-A2/D0-D2 nutzen, 
  189. wie es die Konventionen der meisten C-Compiler auf dem Atari erlauben. 
  190. Diese ganzen Aktionen laufen bei einem Interrupt Priority Level von 6 ab, 
  191. so daž keine weiteren Interrupts dazwischen kommen k”nnen. Wenn man den 
  192. IPL heruntersetzt (zeitweilig in der XXXXsys-Routine), so k”nnen vom MFP aus 
  193. wenigstens h”herpriorisierte Interrupts wie der fr MODEM1 
  194. dazwischenkommen.
  195.  
  196. vmiderr() und vkbderr() werden von midisys() bzw. ikbdsys() aufgerufen, 
  197. wenn ein Empfangspufferberlauf vorlag. Das empfangene Zeichen wird 
  198. trotzdem in D0.b bergeben. Die Fehlerbedingung wurde im ACIA bereits 
  199. zurckgesetzt. Andere Fehlerbedingungen werden ignoriert und fhren nicht 
  200. zum Aufruf der vXXXerr(). Falls man eigene XXXXsys()-Routinen einsetzt, 
  201. werden die vXXXerr() also nur noch aufgerufen, wenn es die eigene 
  202. XXXXsys()-Routine tut. Die vXXXerr() drfen A0-A2/D0-D2 benutzen und 
  203. bestehen im TOS nur aus einem RTS.
  204.  
  205. midivec() wird von midisys() aufgerufen, wenn ein Zeichen von der 
  206. MIDI_ACIA fehlerfrei empfangen wurde. Das Zeichen wird in D0.b bergeben. 
  207. Die Routine darf A0-A2/D0-D2 benutzen und schreibt im TOS das Zeichen in 
  208. den MIDI-Empfangspuffer.
  209.  
  210. Alle anderen Routinen werden von ikbdsys() aufgerufen, nachdem ikbdsys 
  211. alle Byte empfangen hat, die zu dem entsprechenden Paket geh”ren. Diese 
  212. Byte wurden in einem Puffer gesammelt und der Routine wird ein Zeiger auf 
  213. diesen Puffer im Register A0 und auf dem Stack bergeben. Die Routinen 
  214. drfen A0-A2/D0-D2 benutzen. Sie sollten so kurz wie m”glich sein, denn 
  215. eine Laufzeit von 1ms (wie im Profibuch angegeben) begrenzt die ber 
  216. MODEM1 fehlerfrei empfangbare Datenrate bereits auf nur 9600Bd (die Daten 
  217. von MIDI mit 31250Bd gehen schon viel frher hops). Eine Alternative sind 
  218. reentrante Routinen (also den Pufferinhalt erst kopieren), die den IPL 
  219. w„hrend ihrer Laufzeit auf weniger als 6 setzen und so wenigstens den 
  220. MODEM1-Empfang (der im MFP h”her priorisiert ist) erlauben.
  221.  
  222. Wenn man diese 4 anderen Routinen betrachtet, so fehlt eine Routine, die 
  223. die normalen Tastendrcke (Byte $00-$F5) verarbeitet. Der Zeiger auf diese 
  224. Routine liegt erfahrungsgem„ž (das ist nicht dokumentiert) genau vor der 
  225. KBDVECS-Struktur. Dieser Routine wird das Zeichen in D0.b bergeben und 
  226. sie darf A0-A2/D0-D2 benutzen. Sie verarbeitet die Zeichen und schreibt 
  227. entsprechende Daten in den Empfangspuffer, der dann z.B. vom 
  228. Bconin-Tastatur gelesen wird. Beim TOS2.06 ist jeder Empfangspuffereintrag 
  229. ein LONG.
  230.  
  231. mousevec() kann nicht nur vom ikbdsys(), sondern auch von der 
  232. undokumentierten Tastenroutine und von der Tastaturrepeat-Routine 
  233. aufgerufen werden, wenn die Tastatur zur Mausemulation benutzt wird.
  234.  
  235. drvstat ist immer dann ungleich 0, wenn ibkdsys() gerade ein Paket 
  236. zusammensammelt. Undokumentiert wird beim TOS2.06 das Highbyte zum 
  237. Speichern der internen Routinennummer (abgeleitet aus dem empfangenen 
  238. Header) und das Lowbyte als Abw„rtsz„hler fr die Anzahl der noch zu 
  239. empfangenden Byte benutzt.
  240.  
  241. Wenn man einer der 4 Routinen selbstgebastelte Pakete zukommen lassen 
  242. will, so muž man sicherstellen, daž diese (im TOS) nicht reentranten 
  243. Routinen nicht zuf„lligerweise auch aus dem Interrupt heraus aufgerufen 
  244. werden. Also entweder IPL auf 6 oder 7 setzen, oder in KBDVECS kurzzeitig 
  245. eine Dummy-Routine (die sich m”glicherweise nur das Paket irgendwo merkt) 
  246. anstelle der Originalroutine installieren, die man gerade selbst aufruft.
  247.  
  248.  
  249.  
  250. Versionen
  251. ---------
  252. (Datum in der Form Jahr-Monat-Tag)
  253. 1994-08-27  sollte erstmalig richtig funktionieren
  254. 1994-10-24  TIOCM_RER (overrun, frame, parity) mit TIOCCTLGET erfragbar
  255. 1994-12-30  schnelle Bconout-Parameterbergabe ge„ndert 
  256. (und MAPT_APP/MAPT_OVE Funktiosnummer)
  257. 1995-01-15  l„uft jetzt mit TOS-Versionen vor 2.00
  258. 1995-03-19  belegt ab TOS1.02 auch Original-MIDI BIOS-Nummern und kann 
  259. auch Original-MIDI-Iorec sowie Midiws bereitstellen
  260. 1995-04-08  ACIA-Reset bei Installation eingefgt (n”tig unter MagiCMac)
  261. 1995-04-28  neuer Konfig-Punkt MISY
  262.  
  263. Harun Scheutzow, Berlin den 27.08.1994 und sp„ter
  264.  
  265.  
  266.  
  267. MIDI.PRG
  268. ********
  269.  
  270. This is a SERSOFST.TXT-conform driver for the MIDI-interface. You 
  271. shouldn't use it together with music programs using the MIDI-interface 
  272. because it is intended for file transfer and terminal purposes.
  273.  
  274. I don't have the time to translate the whole text. If nobody else does it, 
  275. sorry, English-speaking world, you will never got an English version.
  276.  
  277. This driver installs with the GEMDOS-name "MIDI" and the first empty BIOS 
  278. device number. It is fully interrupt driven. It allows the two baud rates 
  279. possible on the MIDI-port(31250, 7812). It supports "none" and "XON/XOFF" 
  280. handshake. Zmodem usually escapes the XON and XOFF characters that's why 
  281. you can use this handshake with Zmodem. I got transfer rates of 
  282. approximately 3000cps, that means near the physical limit.
  283.  
  284.